/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package GestorPago;

import ConexionBD.ConexionBD;
import GestorCuota.Cuota;
import GestorCuota.CuotaBD;
import GestorJugadores.Jugador;
import GestorJugadores.JugadorBD;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author frpp
 */
public class PagoBD {
        
    	private static PagoBD Instancia=null;

        
        public void PagoBD(){}
        
        
        
        static public PagoBD getInstancia(){
            if (Instancia == null){
                Instancia = new PagoBD();
            }
            return Instancia;
        }
        
        
    @Override
    /**
     * Sobrecarga del método clone para impedir que se duplique la instancia
     * (Exigencias del patrón Singleton)
     * @param void
     * @return Object
     */
    public Object clone() throws CloneNotSupportedException {
        throw new CloneNotSupportedException(); 
    }
        
        
        /**
	 * 
	 * @param Pago
	 */
	public Pago addPago(Pago pag){
            
            
            
            String consulta="INSERT INTO Pago(IdCuota, IdJugador, Mes) " +
                " VALUES('" + pag.getCuota().getIdCuota() +
            "','" + pag.getJugador().getIdJugador() +
            "','" + pag.getMes() +
            "');";
        
            
            System.out.println(consulta);
            try {               
                ConexionBD.getInstancia().conectar();
                ResultSet salidaBD = ConexionBD.getInstancia().actualizar(consulta);
                salidaBD.first();
                // Establece el valor de IdJornada generado por la BD en el objeto jornada
                pag.setIdPago(salidaBD.getInt(1));          // establece el valor de IdEquipo generado por la BD en el objeto e
                ConexionBD.getInstancia().desconectar();
            } catch (SQLException ex) {
                ex.printStackTrace();
                return null;
            }
            return pag;
	}

        
        
        
	/**
	 * 
	 * @param Pago
	 */
	public boolean deletePago(Pago pag){
            
            String consulta;
            Boolean salida = true;
            
            consulta = "DELETE FROM Pago WHERE IdPago=" +  pag.getIdPago().toString() +
                    ";";
            
            try {
                ConexionBD.getInstancia().conectar();
                ResultSet salidaBD = ConexionBD.getInstancia().actualizar(consulta);
                ConexionBD.getInstancia().desconectar();
            } catch (SQLException ex) {
                ex.printStackTrace();             
                salida= false;
            }
		return salida;
	}

	

        
        
        
	/*  
         * 
         * @param String temporada
         * @return ArrayList<Pago>
         * 
         *  Método que obtiene una lista pagos de un jugador en una temporada 
         * 
         */
	public ArrayList<Pago> GenerarListadoPagoJugador( int idJug, int ano, String temporada){
                String consulta;
    
                consulta="SELECT pag.IdPago , pag.IdCuota, pag.IdJugador, pag.Mes FROM Pago pag, Cuota cuot WHERE " +
                       // " cout.AnioNacimiento = '" + ano +"'"+ 
                        "  cuot.Temporada = '" + temporada +"'"+ 
                        " AND pag.IdCuota = cuot.IdCuota" +
                        " AND pag.IdJugador = " + idJug +
                    ";";
                
            Pago part;   
            ArrayList<Pago> APart = new ArrayList<Pago>();
            
                try {
                ConexionBD.getInstancia().conectar();
                ResultSet tabla = ConexionBD.getInstancia().consultar(consulta);
                
                Cuota cuot=null;
                Jugador jug=null;
                while (tabla.next()) { // Si devuelve false es que la búsqueda es vacía,  
                        
                         cuot = CuotaBD.getInstancia().getCuota(tabla.getInt("IdCuota")) ; 
                         jug = JugadorBD.getInstancia().getJugador(idJug);
 
                        part = new Pago(cuot, 
                                        jug,
                                        tabla.getString("Mes"));
                        
                    part.setIdPago(tabla.getInt("IdPago"));

                    APart.add(part); 
                
                }
                ConexionBD.getInstancia().desconectar();
            } catch (SQLException ex) {
                ex.printStackTrace();
                return null;
            }
            return APart;
	}
        
        
        /*  
         * 
         * @param String temporada
         * @param String mes
         * @return ArrayList<Jugador>
         * 
         *  Método que obtiene una lista de nombre / apellidos de aquellos
         *  jugadores que  han pagado el mes correspondiente.
         * 
         */
	public ArrayList<Jugador> GenerarListadoPago(String temporada , String mes){
                String consulta;
                
                consulta = "select jug.IdJugador, jug.Nombre, jug.Apellidos, jug.Sexo, "
                    + " jug.Nacimiento , jug.Talla, jug.Tutor, jug.Correo, jug.NumCuenta ,"
                    + " jug.Telefono, jug.Observaciones, jug.FormaPago from Jugador jug "
                    +" where jug.FormaPago = 'M' "
                    +" and jug.IdJugador  in ("

                    +" select pag.Idjugador from Pago pag"
            +" inner join Cuota cuot"
            +" on pag.IdCuota = cuot.IdCuota"
            +" where cuot.Temporada = '" +  temporada + "'"
            +" AND pag.Mes = '" +mes + "' "
            +" );";
                
                //System.out.println(consulta);
                
            Jugador part;   
            ArrayList<Jugador> APart = new ArrayList<Jugador>();
            try {
                ConexionBD.getInstancia().conectar();
                ResultSet tabla = ConexionBD.getInstancia().consultar(consulta);
                
                while (tabla.next()) { // Si devuelve false es que la búsqueda es vacía,
                    part = new Jugador(tabla.getString("Nombre"), tabla.getString("Apellidos"),
                            tabla.getString("Sexo").charAt(0), tabla.getDate("Nacimiento"),
                            tabla.getString("Talla"), tabla.getString("Tutor"), tabla.getString("Correo"),
                            tabla.getString("NumCuenta"), tabla.getInt("Telefono"),
                            tabla.getString("Observaciones"),
                            tabla.getString("FormaPago").charAt(0),
                            null);
                    part.setIdJugador(tabla.getInt("IdJugador"));

                    APart.add( (part) ); 
                }
                
     
                ConexionBD.getInstancia().desconectar();
            } catch (SQLException ex) {
                ex.printStackTrace();
                return null;
            }
            
            return APart;   
        }
        
        
        /*  
         * 
         * @param String temporada
         * @param String mes
         * @return ArrayList<Jugador>
         * 
         *  Método que obtiene una lista de nombre / apellidos de aquellos
         *  jugadores que no han pagado el mes correspondiente.
         * 
         */
        public ArrayList<Jugador> GenerarListadoImpago(String temporada, String mes){
        String consulta; // Obtenemos la lista de idJugadores que tiene pagos en ese mes.

            consulta = "select jug.IdJugador, jug.Nombre, jug.Apellidos, jug.Sexo, "
            + " jug.Nacimiento , jug.Talla, jug.Tutor, jug.Correo, jug.NumCuenta ,"
            + " jug.Telefono, jug.Observaciones, jug.FormaPago from Jugador jug "
            +" where jug.FormaPago = 'M' "
            +" and jug.IdJugador not in ("

            +" select pag.Idjugador from Pago pag"
    +" inner join Cuota cuot"
    +" on pag.IdCuota = cuot.IdCuota"
    +" where cuot.Temporada = '" +  temporada + "'"
    +" AND pag.Mes = '" +mes + "' "
    +" );";
            
            //hay que crear los objetos jugador
            Jugador part;   
            ArrayList<Jugador> APart = new ArrayList<Jugador>();
            try {
                ConexionBD.getInstancia().conectar();
                ResultSet tabla = ConexionBD.getInstancia().consultar(consulta);
                
                while (tabla.next()) { // Si devuelve false es que la búsqueda es vacía,
                    part = new Jugador(tabla.getString("Nombre"), tabla.getString("Apellidos"),
                            tabla.getString("Sexo").charAt(0), tabla.getDate("Nacimiento"),
                            tabla.getString("Talla"), tabla.getString("Tutor"), tabla.getString("Correo"),
                            tabla.getString("NumCuenta"), tabla.getInt("Telefono"),
                            tabla.getString("Observaciones"),
                            tabla.getString("FormaPago").charAt(0),
                            null);
                    part.setIdJugador(tabla.getInt("IdJugador"));

                    APart.add( (part) ); 
                }
                
     
                ConexionBD.getInstancia().desconectar();
            } catch (SQLException ex) {
                ex.printStackTrace();
                return null;
            }
            
            return APart;   
        }
        
        
        
        
        
        

	/**
	 * 
	 * @param Pago
	 */
	public boolean updatePago(Jugador jugador, String temporada, String mes, String newmes){
            Boolean salida = true;

            Date aux = jugador.getNacimiento();
             
            SimpleDateFormat formateador = new SimpleDateFormat("yyyy");    //le aplico el formato dia-mes-año        
            String fecha_consulta =  formateador.format(aux);
            
            int fecha = Integer.parseInt(fecha_consulta);
            
            ArrayList<Cuota> cuota = CuotaBD.getInstancia().getCuota(temporada, fecha);

            
            String consulta="UPDATE Pago pag, Cuota cuot SET " +
                    " pag.Mes='" + newmes + "'"+
                    " WHERE   cuot.AnioNacimiento = '" + cuota.get(0).getAnioNacimiento()+"'" +
                    " AND cuot.Temporada = '" + cuota.get(0).getTemporada() +"'" +
                    " AND pag.IdJugador = " + jugador.getIdJugador() +
                    " AND pag.Mes = '" + mes +"'"+
                    ";";
            
            System.out.println(consulta);
          
            try {
                ConexionBD.getInstancia().conectar();
                ConexionBD.getInstancia().actualizar(consulta);
                ConexionBD.getInstancia().desconectar();
            } catch (SQLException ex) {
                System.out.println(ex);
                salida = false;
            }
            return salida;
	}
        
        
        
        
        
         
         
         
         
         
    
    
}
